#pragma once
#include <iostream>
#include <set>
#include <list>
using namespace std;

class Node {
public:

	enum NODE_TYPE
	{
		NODE_MAP,
		NODE_CHA,
		NODE_ITEM,
		NODE_TILE,
		NODE_PORTRAYABLE,
		NODE_MAPPABLE,
		NODE_STAT,
		NODE_TAG,
		NODE_ACTIVITY,
	};
public:
	Node();
	Node(Node &parent);
	virtual ~Node();
	void createNode(string name);

	inline NODE_TYPE getType() { return type_; }
	inline string getName() { return name_; }
	inline int getId() { return id_; }
private:
	int id_;
	string name_;
	Node* parent_;
	
	static int getNextId();
	static int s_id_indexer;
	static set<int> s_id_set;

protected:
	NODE_TYPE type_;
};
/*
template<class T>
class NodeList : public list<T> {
	NodeList() {
		this->insert();
	}
	template<class_iter> insert()
};
*/